#ifndef MJPEGWORKER_H
#define MJPEGWORKER_H

#include <QObject>
#include "mjpg.h"
#include "ui_mjpg.h"
#include <QThread>
#include <QImageReader>
#include <QBuffer>
#include <QDateTime>
class MJPEGWorker : public QObject
{
    Q_OBJECT
public:
    explicit MJPEGWorker(QObject *parent = 0);
    MJPEGWorker(QNetworkReply* reply, QLabel* imageLabel)
            : m_reply(reply), m_imageLabel(imageLabel) {
            connect(m_reply, &QNetworkReply::readyRead, this, &MJPEGWorker::processFrame);
            connect(m_reply, &QNetworkReply::finished, this, &MJPEGWorker::onFinished);
        }
    ~MJPEGWorker();

signals:
    void updateImage(const QPixmap& pixmap);  // 更新UI信号
        void finished();  // 请求完成信号

public slots:
    void processFrame() {
        // 将 m_reply 读取的所有数据追加到 m_buffer 缓冲区中
            m_buffer.append(m_reply->readAll());
            // 查找 JPEG 图像的起始标记（SOI，Start of Image），标记为 "\xFF\xD8"
            int startIdx = m_buffer.indexOf("\xFF\xD8"); // JPEG SOI marker
            // 从起始标记之后查找 JPEG 图像的结束标记（EOI，End of Image），标记为 "\xFF\xD9"
            int endIdx = m_buffer.indexOf("\xFF\xD9", startIdx); // JPEG EOI marker

            if (startIdx != -1 && endIdx != -1 && endIdx > startIdx) {
                // 从 m_buffer 中提取完整的 JPEG 图像数据
                QByteArray jpegData = m_buffer.mid(startIdx, endIdx - startIdx + 2);
                // 从 m_buffer 中移除已经处理过的 JPEG 图像数据
                m_buffer.remove(0, endIdx + 2);  // Remove the processed frame

                // 使用QBuffer提高解码效率
                QBuffer buffer(&jpegData);
                buffer.open(QIODevice::ReadOnly);
                // 创建一个 QImageReader 对象，用于读取 JPEG 图像数据
                QImageReader reader(&buffer, "JPEG");
                // 检查 QImageReader 是否能够读取该 JPEG 图像数据
                if (reader.canRead()) {
                    // 读取 JPEG 图像数据并解码为 QImage 对象
                    QImage image = reader.read();
                    // 检查解码后的 QImage 对象是否有效
                    if (!image.isNull()) {
                        // 将 QImage 对象转换为 QPixmap 对象，并根据 m_imageLabel 的大小进行缩放，保持宽高比
                        QPixmap pixmap = QPixmap::fromImage(image).scaled(m_imageLabel->size(), Qt::KeepAspectRatio);
                        // 发出 updateImage 信号，通知 UI 更新显示的图片
                        emit updateImage(pixmap);  // 通知UI更新图片
                    }
                }
            }
        }

        void onFinished() {
            QMetaObject::invokeMethod(m_reply, "deleteLater");
            emit finished();  // 发出完成信号
        }
private:
        QNetworkReply* m_reply;
           QLabel* m_imageLabel;
           QByteArray m_buffer;
};

#endif // MJPEGWORKER_H
